home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP10 / GRAFMENU.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-01  |  7.2 KB  |  219 lines

  1. /*----------------------------------------------
  2.    GRAFMENU.C -- Demonstrates Bitmap Menu Items
  3.                  (c) Charles Petzold, 1996
  4.   ----------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <string.h>
  8. #include "grafmenu.h"
  9.  
  10. LRESULT CALLBACK WndProc  (HWND, UINT, WPARAM, LPARAM) ;
  11. HBITMAP StretchBitmap (HBITMAP) ;
  12. HBITMAP GetBitmapFont (int) ;
  13.  
  14. char szAppName[] = "GrafMenu" ;
  15.  
  16. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  17.                     PSTR szCmdLine, int iCmdShow)
  18.      {
  19.      HBITMAP    hBitmapHelp, hBitmapFile, hBitmapEdit,
  20.                 hBitmapFont, hBitmapPopFont[3] ;
  21.      HMENU      hMenu, hMenuPopup ;
  22.      HWND       hwnd ;
  23.      int        i ;
  24.      MSG        msg ;
  25.      WNDCLASSEX wndclass ;
  26.  
  27.      wndclass.cbSize        = sizeof (wndclass) ;
  28.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  29.      wndclass.lpfnWndProc   = WndProc ;
  30.      wndclass.cbClsExtra    = 0 ;
  31.      wndclass.cbWndExtra    = 0 ;
  32.      wndclass.hInstance     = hInstance ;
  33.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  34.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  35.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  36.      wndclass.lpszMenuName  = NULL ;
  37.      wndclass.lpszClassName = szAppName ;
  38.      wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
  39.  
  40.      RegisterClassEx (&wndclass) ;
  41.  
  42.      hMenu = CreateMenu () ;
  43.  
  44.      hMenuPopup = LoadMenu (hInstance, "MenuFile") ;
  45.      hBitmapFile = StretchBitmap (LoadBitmap (hInstance, "BitmapFile")) ;
  46.      AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,
  47.                  (PSTR) (LONG) hBitmapFile) ;
  48.  
  49.      hMenuPopup = LoadMenu (hInstance, "MenuEdit") ;
  50.      hBitmapEdit = StretchBitmap (LoadBitmap (hInstance, "BitmapEdit")) ;
  51.      AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,
  52.                  (PSTR) (LONG) hBitmapEdit) ;
  53.  
  54.      hMenuPopup = CreateMenu () ;
  55.  
  56.      for (i = 0 ; i < 3 ; i++)
  57.           {
  58.           hBitmapPopFont[i] = GetBitmapFont (i) ;
  59.           AppendMenu (hMenuPopup, MF_BITMAP, IDM_COUR + i,
  60.                       (PSTR) (LONG) hBitmapPopFont[i]) ;
  61.           }
  62.  
  63.      hBitmapFont = StretchBitmap (LoadBitmap (hInstance, "BitmapFont")) ;
  64.      AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,
  65.                  (PSTR) (LONG) hBitmapFont) ;
  66.  
  67.      hwnd = CreateWindow (szAppName, "Bitmap Menu Demonstration",
  68.                           WS_OVERLAPPEDWINDOW,
  69.                           CW_USEDEFAULT, CW_USEDEFAULT,
  70.                           CW_USEDEFAULT, CW_USEDEFAULT,
  71.                           NULL, hMenu, hInstance, NULL) ;
  72.  
  73.      hMenu = GetSystemMenu (hwnd, FALSE);
  74.      hBitmapHelp = StretchBitmap (LoadBitmap (hInstance, "BitmapHelp")) ;
  75.      AppendMenu (hMenu, MF_SEPARATOR, NULL,     NULL) ;
  76.      AppendMenu (hMenu, MF_BITMAP,    IDM_HELP, (PSTR) (LONG) hBitmapHelp) ;
  77.  
  78.      ShowWindow (hwnd, iCmdShow) ;
  79.      UpdateWindow (hwnd) ;
  80.  
  81.      while (GetMessage (&msg, NULL, 0, 0))
  82.           {
  83.           TranslateMessage (&msg) ;
  84.           DispatchMessage (&msg) ;
  85.           }
  86.  
  87.      DeleteObject (hBitmapHelp) ;
  88.      DeleteObject (hBitmapEdit) ;
  89.      DeleteObject (hBitmapFile) ;
  90.      DeleteObject (hBitmapFont) ;
  91.  
  92.      for (i = 0 ; i < 3 ; i++)
  93.           DeleteObject (hBitmapPopFont[i]) ;
  94.  
  95.      return msg.wParam ;
  96.      }
  97.  
  98. HBITMAP StretchBitmap (HBITMAP hBitmap1)
  99.      {
  100.      BITMAP     bm1, bm2 ;
  101.      HBITMAP    hBitmap2 ;
  102.      HDC        hdc, hdcMem1, hdcMem2 ;
  103.      TEXTMETRIC tm ;
  104.  
  105.      hdc = CreateIC ("DISPLAY", NULL, NULL, NULL) ;
  106.      GetTextMetrics (hdc, &tm) ;
  107.      hdcMem1 = CreateCompatibleDC (hdc) ;
  108.      hdcMem2 = CreateCompatibleDC (hdc) ;
  109.      DeleteDC (hdc) ;
  110.  
  111.      GetObject (hBitmap1, sizeof (BITMAP), (PSTR) &bm1) ;
  112.  
  113.      bm2 = bm1 ;
  114.      bm2.bmWidth      = (tm.tmAveCharWidth * bm2.bmWidth)  / 4 ;
  115.      bm2.bmHeight     = (tm.tmHeight       * bm2.bmHeight) / 8 ;
  116.      bm2.bmWidthBytes = ((bm2.bmWidth + 15) / 16) * 2 ;
  117.  
  118.      hBitmap2 = CreateBitmapIndirect (&bm2) ;
  119.  
  120.      SelectObject (hdcMem1, hBitmap1) ;
  121.      SelectObject (hdcMem2, hBitmap2) ;
  122.  
  123.      StretchBlt (hdcMem2, 0, 0, bm2.bmWidth, bm2.bmHeight,
  124.                  hdcMem1, 0, 0, bm1.bmWidth, bm1.bmHeight, SRCCOPY) ;
  125.  
  126.      DeleteDC (hdcMem1) ;
  127.      DeleteDC (hdcMem2) ;
  128.      DeleteObject (hBitmap1) ;
  129.  
  130.      return hBitmap2 ;
  131.      }
  132.  
  133. HBITMAP GetBitmapFont (int i)
  134.      {
  135.      static char   *szFaceName[3] = { "Courier New", "Arial",
  136.                                       "Times New Roman" } ;
  137.      static LOGFONT lf ;
  138.      HBITMAP        hBitmap ;
  139.      HDC            hdc, hdcMem ;
  140.      HFONT          hFont ;
  141.      SIZE           size ;
  142.      TEXTMETRIC     tm ;
  143.  
  144.      hdc = CreateIC ("DISPLAY", NULL, NULL, NULL) ;
  145.      GetTextMetrics (hdc, &tm) ;
  146.  
  147.      lf.lfHeight = 2 * tm.tmHeight ;
  148.      strcpy ((char *) lf.lfFaceName, szFaceName[i]) ;
  149.  
  150.      hdcMem = CreateCompatibleDC (hdc) ;
  151.      hFont = (HFONT) SelectObject (hdcMem, CreateFontIndirect (&lf)) ;
  152.      GetTextExtentPoint (hdcMem, szFaceName[i], strlen (szFaceName[i]), &size) ;
  153.  
  154.      hBitmap = CreateBitmap (size.cx, size.cy, 1, 1, NULL) ;
  155.      SelectObject (hdcMem, hBitmap) ;
  156.  
  157.      TextOut (hdcMem, 0, 0, szFaceName[i], strlen (szFaceName[i])) ;
  158.  
  159.      DeleteObject (SelectObject (hdcMem, hFont)) ;
  160.      DeleteDC (hdcMem) ;
  161.      DeleteDC (hdc) ;
  162.  
  163.      return hBitmap ;
  164.      }
  165.  
  166. LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  167.      {
  168.      HMENU      hMenu ;
  169.      static int iCurrentFont = IDM_COUR ;
  170.  
  171.      switch (iMsg)
  172.           {
  173.           case WM_CREATE :
  174.                CheckMenuItem (GetMenu (hwnd), iCurrentFont, MF_CHECKED) ;
  175.                return 0 ;
  176.  
  177.           case WM_SYSCOMMAND :
  178.                switch (LOWORD (wParam))
  179.                     {
  180.                     case IDM_HELP :
  181.                          MessageBox (hwnd, "Help not yet implemented!",
  182.                                      szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  183.                          return 0 ;
  184.                     }
  185.                break ;
  186.  
  187.           case WM_COMMAND :
  188.                switch (LOWORD (wParam))
  189.                     {
  190.                     case IDM_NEW :
  191.                     case IDM_OPEN :
  192.                     case IDM_SAVE :
  193.                     case IDM_SAVEAS :
  194.                     case IDM_UNDO :
  195.                     case IDM_CUT :
  196.                     case IDM_COPY :
  197.                     case IDM_PASTE :
  198.                     case IDM_DEL :
  199.                          MessageBeep (0) ;
  200.                          return 0 ;
  201.  
  202.                     case IDM_COUR :
  203.                     case IDM_ARIAL :
  204.                     case IDM_TIMES :
  205.                          hMenu = GetMenu (hwnd) ;
  206.                          CheckMenuItem (hMenu, iCurrentFont, MF_UNCHECKED) ;
  207.                          iCurrentFont = LOWORD (wParam) ;
  208.                          CheckMenuItem (hMenu, iCurrentFont, MF_CHECKED) ;
  209.                          return 0 ;
  210.                     }
  211.                break ;
  212.  
  213.           case WM_DESTROY :
  214.                PostQuitMessage (0) ;
  215.                return 0 ;
  216.           }
  217.      return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
  218.      }
  219.